Bson 与 JSON 的序列化与反序列化 |
您所在的位置:网站首页 › python json序列化和反序列化 › Bson 与 JSON 的序列化与反序列化 |
Bson 与 JSON 的序列化与反序列化
参考文章: http://blog.csdn.net/z69183787/article/details/26709505https://blog.csdn.net/dai815904261/article/details/78919414https://www.cnblogs.com/fengxuehuanlin/p/5700282.htmlhttps://www.cnblogs.com/yanweidie/p/4605212.html一, Bson 和 JSON 的区别 BSON 是由 10gen 开发的一个数据格式, 是一种基于 JSON 的二进制序列化格式, 用于 MongoDB 存储文档并进行远程过程调用. BSON 基于 JSON 格式, 选择 JSON 进行改造的原因主要是 JSON 的通用性及 JSON 的 schemaless 的特性. BSON 主要会实现以下三点目标: (1) 更快的遍历速度 对 JSON 格式来说, 太大的 JSON 结构会导致数据遍历非常慢. 在 JSON 中, 要跳过一个文档进行数据读取, 需要对此文档进行扫描才行, 需要进行麻烦的数据结构匹配, 比如括号的匹配, 而 BSON 对 JSON 的一大改进就是, 它会将 JSON 的每一个元素的长度存在元素的头部, 这样你只需要读取到元素长度就能直接 seek 到指定的点上进行读取了. (2) 操作更简易 对 JSON 来说, 数据存储是无类型的, 比如你要修改基本一个值, 从 9 到 10, 由于从一个字符变成了两个, 所以可能其后面的所有内容都需要往后移一位才可以. 而使用 BSON, 你可以指定这个列为数字列, 那么无论数字从 9 长到 10 还是 100, 我们都只是在存储数字的那一位上进行修改, 不会导致数据总长变大. 当然, 在 MongoDB 中, 如果数字从整形增大到长整型, 还是会导致数据总长变大的. (3) 增加了额外的数据类型 JSON 是一个很方便的数据交换格式, 但是其类型比较有限. BSON 在其基础上增加了 "byte array" 数据类型. 这使得二进制的存储不再需要先 base64 转换后再存成 JSON. 大大减少了计算开销和数据大小. 但是, 在有的时候, BSON 相对 JSON 来说也并没有空间上的优势, 比如对 {"field":7}, 在 JSON 的存储上 7 只使用了一个字节, 而如果用 BSON, 那就是至少 4 个字节 (32 位) 目前在 10gen 的努力下, BSON 已经有了针对多种语言的编码解码包. 并且都是 Apache 2 license 下开源的. 并且还在随着 MongoDB 进一步地发展. BSON 支持的数据类型如表所示. BSON 支持的数据类型类型 描述示例NULL表示空值或者不存在的字段,{"x" : null}Boolean布尔型有 true 和 false,{"x" : true}Number数值:客户端默认使用 64 位浮点型数值。{"x" : 3.14} 或 & nbsp;{"x" : 3}。对于整型值,包括 NumberInt(4 字节符号整数)或 NumberLong(8 字节符号整数),用户可以指定数值类型,{"x" : NumberInt("3")}String字符串:BSON 字符串是 UTF-8,{"x" : "中文"}Regular Expression正则表达式:语法与 & nbsp;JavaScript http://c.biancheng.net/js/的正则表达式相同,{"x" : /[cba]/} Array数组:使用 “[]” 表示,{"x" : ["a", "b", "c"]}Object内嵌文档:文档的值是嵌套文档,{"a" : {"b" : 3}}ObjectId对象 id:对象 id 是一个 12 字节的字符串,是文档的唯一标识,{"x" : objectId()}BinaryData二进制数据:二进制数据是一个任意字节的字符串。它不能直接在 & nbsp;Shell http://c.biancheng.net/shell/中使用。如果要将非 UTF-8 字符保存到数据库中,二进制数据是唯一的方式 Java http://c.biancheng.net/java/Script 代码:查询和文档中可以包括任何 JavaScript 代码,{"x" : function(){/*...*/}}Data日期:{"x" : new Date()}Timestamp时间戳:var a = new Timestamp()二, JSON 的序列化和反序列化 1. 使用 JavaScriptSerializer 类: // 使用 JavaScriptSerializer 方式需要引入的命名空间, 这个在程序集 System.web.Extensions.dll. 中using System.Web.Script.Serialization;2. 使用 DataContractJsonSerializer 类: // 实体中的特性 [DataMember],[DataContract], 是使用 DataContractJsonSerializer 序列化和反序列化必须要加的// 使用 DataContractJsonSerializer 方式需要引入的命名空间, 在 System.Runtime.Serialization.dll. 中using System.Runtime.Serialization.JSON;3.(推荐) 使用 JSON.NET(即 Newtonsoft.JSON) 类库: using Newtonsoft.JSON; 反序列化: JsonConvert.DeserializeObject() 序列化: JsonConvert.SerializeObject() JSON.NET 是支持序列化和反序列化 DataTable,DataSet,Entity Framework 和 Entity 的. 序列化和反序列化常用到 JsonSerializerSettings 类进行设置 class Program { static void Main(string[] args) { // 序列化操作 var JSON = new { user = new { name = "fxhl", age = 23 }}; string jsonData = JsonConvert.SerializeObject(JSON); Console.WriteLine(jsonData); // 反序列化操作方法一 Person p1= JsonConvert.DeserializeObject(jsonData); Console.WriteLine(p1.user.name); // 反序列化操作方法二 string json2 = "[{\"user\":{\"name\":\"fxhl\",\"age\":23}}]"; List listp2= JsonConvert.DeserializeObject(json2); Console.WriteLine(listp2[0].user.name); Console.ReadKey(); } } public class Person { public Person user { get; set; } public string name { get; set; } public int age { get; set; } }三, Bson 的序列化与反序列化 反序列化: BsonSerializer.Deserialize() 序列化: BsonExtensionMethods.ToJson() 四, 高级用法 请点原文链接查看 Newtonsoft.JSON 高级用法 https://www.cnblogs.com/yanweidie/p/4605212.html 1. 使用特性实现特殊化处理 序列化和反序列化对象时, 可以通过在字段和类上添加特性, 实现特殊化处理 1.1 类特性 [BsonIgnoreExtraElements]:BsonSerializer 时, 忽略未匹配到 i 的字段, 可避免在反序列化时会因为缺少_id 字段而无法成功反序列化对象. [JsonObject(MemberSerialization.OptIn)] OptOut 默认值, 类中所有公有成员会被序列化, 如果不想被序列化, 可以用特性 JsonIgnoreOptIn 默认情况下, 所有的成员不会被序列化, 类中的成员只有标有特性 JsonProperty 的才会被序列化, 当类的成员很多, 但客户端仅仅需要一部分数据时, 很有用1.2 字段特性 可以设置字段是否被忽略, 默认值, null 值处理和类型等等处理. 下面仅列出一些常用特性: ,[Newtonsoft.JSON.JsonIgnore] 特性: 使用 Newtonsoft.JSON 序列化时字段不会被序列化. ,[System.Web.Script.Serialization.ScriptIgnore] 特性: 使用 JavaScriptSerializer 序列化时字段不会被序列化. ,[System.xml.Serialization.XmlIgnore] 特性: 字段不会被序列化成 xml. ,[BsonIgnore] 特性: BsonSerializer 时, 字段不会被序列化. ,[BsonElement]: 自定义字段关联的名称和特殊处理 ,[JsonProperty]: 自定义字段关联的名称和特殊处理 ,[BsonRepresentation] 2. 采用 JsonSerialzerSettings 统一设置 JsonSerialzerSettings 是 JsonConvert 方法中的参数, 当所有字段做相同处理时, 可直接配置在 JsonSerialzerSettings 中. 例如, JSON 序列化时, 如果时间类型中的毫秒是 0, 则在序列化时会被省略, // 设置不忽略时间的毫秒.JsonSerializerSettings settings = new JsonSerializerSettings();IsoDateTimeConverter dateConverter = new IsoDateTimeConverter{ DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" };settings.Converters.Add(dateConverter);string jsonStr = JsonConvert.SerializeObject(arr, settings);// 反序列化设置 忽略不可匹配的项var jSetting = new JsonSerializerSettings();jSetting.NullValueHandling = NullValueHandling.Ignore;string devicejsonstr = FileHelper.GetContentFromFile(devicePath);device = JsonConvert.DeserializeObject(devicejsonstr, jSetting);3.JsonWriterSettings 配置 把一个对象用 BsonExtensionMethods.ToJson() 方法得到的不是标准 JSON 格式的字符串, value 是带类型说明的. 例如, ToJson() 方法中 int 类型表示为 "Number(x)", 可以使用如下方法改变 Bson 对象序列化时的输出格式: var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };string bsonStr = bsonObj.ToJson(jsonWriterSettings);得到的 bsonStr 就是标准 JSON 格式的字符串. 五, 注意事项 1.Bson 可以看作是 JSON 的特异化, 有相同点, 也有很大的区别. 所以再做序列化和反序列化时, 代码里最好一直用同一套, 或者是用 bson 和 JSON 有严格的隔离, 不要用着 bson 序列化, 再用 JSON 反序列化. 2. 推荐使用 Bson 进行序列化和反序列化. 因为如果类中存在 BsonDocument 类型的字段, JSON 会反序列化失败!! 3. 前后端交互时, 由于前端一般用标准 JSON 格式, 所以切记要加上 var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict }; 来源: http://www.bubuko.com/infodetail-3346165.html 与本文相关文章 JSON 序列和反序列 1 六, Delphi10.3 通过 JSON.Serializers 单元对大量数据序列化 python 解析 JSON python开发模块基础:序列化模块json,pickle,shelve JSON 模块学习 JSON 数据转换为字典时报错'json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes' python使用pickle,json等序列化dict 05 - JSON 转成树状结构 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |